package cn.lg.soar.general.api.service;

import cn.lg.soar.general.api.model.BizFileDTO;
import cn.lg.soar.general.api.model.FileDigestVO;
import cn.lg.soar.general.api.model.FileVO;
import org.springframework.web.multipart.MultipartFile;

import java.util.*;
import java.util.stream.Collectors;

/**
 * 文件上传接口
 * @author luguoxiang
 * 开源项目：https://gitee.com/lgx1992/lg-soar 求star！请给我star！请帮我点个star！
 */
public interface IFileApi {

    /**
     * 秒传（若系统已存在文件则秒传成功）
     * @param bizId 业务id
     * @param bizType 业务类型
     * @param vos 秒传对象
     * @return
     */
    List<FileVO> fastUpload(Long bizId, String bizType, Collection<FileDigestVO> vos);

    /**
     * 秒传（若系统已存在文件则秒传成功）
     * @param bizId 业务id
     * @param bizType 业务类型
     * @param vos 秒传对象
     * @return
     */
    default List<FileVO> fastUpload(Long bizId, String bizType, FileDigestVO...vos) {
        return fastUpload(bizId, bizType, Arrays.asList(vos));
    }

    /**
     * 秒传（若系统已存在文件则秒传成功）
     * @param vos 秒传对象
     * @return
     */
    List<FileVO> fastUpload(Collection<FileDigestVO> vos);

    /**
     * 秒传（若系统已存在文件则秒传成功）
     * @param vos 秒传对象
     * @return
     */
    default List<FileVO> fastUpload(FileDigestVO...vos) {
        return fastUpload(Arrays.asList(vos));
    }

    /**
     * 上传附件
     * @param bizId 业务id
     * @param bizType 业务类型
     * @param files 附件
     * @return
     */
    List<FileVO> upload(Long bizId, String bizType, Collection<MultipartFile> files);

    /**
     * 上传附件
     * @param bizId 业务id
     * @param bizType 业务类型
     * @param files 附件
     * @return
     */
    default List<FileVO> upload(Long bizId, String bizType, MultipartFile...files) {
        return upload(bizId, bizType, Arrays.asList(files));
    }

    /**
     * 上传附件（多个）
     * @param files 附件
     * @return
     */
    List<FileVO> upload(String bucketName, Collection<MultipartFile> files);

    /**
     * 上传附件
     * @param bizId 业务id
     * @param bizType 业务类型
     * @param files 附件
     * @return
     */
    default List<FileVO> upload(String bucketName, MultipartFile...files) {
        return upload(bucketName, Arrays.asList(files));
    }

    /**
     * 上传附件（多个）
     * @param files 附件
     * @return
     */
    List<FileVO> upload(Collection<MultipartFile> files);

    /**
     * 上传附件
     * @param bizId 业务id
     * @param bizType 业务类型
     * @param files 附件
     * @return
     */
    default List<FileVO> upload(MultipartFile...files) {
        return upload(Arrays.asList(files));
    }

    /**
     * 保存业务附件
     * @param bizId
     * @param bizFiles
     * @return
     */
    boolean saveBizFile(Long bizId, Collection<BizFileDTO> bizFiles);

    /**
     * 保存业务附件
     * @param bizId
     * @param bizFiles
     * @return
     */
    default boolean saveBizFile(Long bizId, BizFileDTO...bizFiles) {
        return saveBizFile(bizId, Arrays.asList(bizFiles));
    }

    /**
     * 获取业务附件
     * @param bizId 业务id
     * @param bizTypes 业务类型
     * @return
     */
    Map<String, List<FileVO>> getBizFile(Long bizId, Collection<String> bizTypes);

    /**
     * 获取业务附件
     * @param bizId 业务id
     * @param bizTypes 业务类型
     * @return
     */
    default Map<String, List<FileVO>> getBizFile(Long bizId, String...bizTypes) {
        return getBizFile(bizId, Arrays.asList(bizTypes));
    }

    /**
     * 删除业务附件
     * @param bizId 业务id
     * @param bizTypes 业务类型
     * @return
     */
    boolean removeBizFile(Long bizId, Collection<String> bizTypes);

    /**
     * 删除业务附件
     * @param bizId 业务id
     * @param bizTypes 业务类型
     * @return
     */
    default boolean removeBizFile(Long bizId, String...bizTypes) {
        return removeBizFile(bizId, Arrays.asList(bizTypes));
    }

    /**
     * 创建临时访问路径
     * @param anonymous 是否可以匿名访问
     * @param fileId 文件id
     * @param expire 有效期
     * @param userIds 指定用户可访问，不指定则任意用户可访问
     * @return
     */
    String createTemporaryUrl(boolean anonymous, long fileId, long expire, Set<Long> userIds);

    /**
     * 创建临时访问路径
     * @param anonymous 是否可以匿名访问
     * @param fileId 文件id
     * @param expire 有效期
     * @param userIds 指定用户可访问，不指定则任意用户可访问
     * @return
     */
    default String createTemporaryUrl(boolean anonymous, long fileId, long expire, Long...userIds) {
        return createTemporaryUrl(anonymous, fileId, expire, Arrays.stream(userIds).filter(Objects::nonNull).collect(Collectors.toSet()));
    }

    /**
     * 创建永久访问路径
     * @param fileId
     * @return
     */
    String createFixedSecretUrl(long fileId);

}
